ANTLR 4语法结构

1 语法结构

主要由语法声明和规则组成。

1
2
3
4
5
6
7
8
9
10
11
12
/** Optional javadoc style comment */
grammar Name; ①
options {...}
import ... ;

tokens {...}
channels {...} // lexer only
@actionName {...}

rule1 // parser and lexer rules, possibly intermingled
...
ruleN

文件名称必须命名为${Name}.g4

至少包含文件头①和一条规则。

至多包含一个options、imports和tokens。可以交换顺序。

没有前缀的grammar将词法和解析规则结合。

可以添加lexer或parser区分。

只有lexer grammar可以包含mode和自定义的channel。

1
2
3
4
channels {
WHITESPACE_CHANNEL,
COMMENTS_CHANNEL
}

Channel可以在词法规则中像枚举值一样使用。

1
WS : [ \r\t\n]+ -> channel(WHITESPACE_CHANNEL) ;

2 Imports

类似面向对象的父类继承,当前值覆盖引入的同名值。

img

引入后的值视同当前文件的值,在异常信息中不会出现标记引入信息。

1
2
3
4
5
6
7
8
$ antlr4 MyELang.g4
$ javac MyELang*.java
$ grun MyELang stat
=> 34;
=> a;
=> ;
=> EOF
<= line 3:0 extraneous input ';' expecting {INT, ID}

引入的tokens和actions将会合并。

不建议引入包含命名action和包含规则的action,否则影响复用。

忽略引入的options。

引入遵循深度优先规则。如以下规则r指代的G3中的r。

img

不同的grammar引入的grammar不同:

  • lexer可以引入lexer
  • parser可以引入parser
  • combined可以引入parser和不包含mode的lexer

3 Tokens

用于定义没有关联词法规则的标识类型。

1
tokens { Token1, ..., TokenN }
1
2
3
4
5
6
7
8
9
10
// explicitly define keyword token types to avoid implicit definition warnings
tokens { BEGIN, END, IF, THEN, WHILE }

@lexer::members { // keywords map used in lexer to assign token types
Map<String,Integer> keywords = new HashMap<String,Integer>() {{
put("begin", KeywordsParser.BEGIN);
put("end", KeywordsParser.END);
...
}};
}
1
2
3
4
5
6
7
8
9
10
11
$ cat Tok.g4
grammar Tok;
tokens { A, B, C }
a : X ;
$ antlr4 Tok.g4
warning(125): Tok.g4:3:4: implicit definition of token X in parser
$ cat Tok.tokens
A=1
B=2
C=3
X=4

4 语法级别的Actions

当前仅支持两个语法规则外的命名action: header和member。

前者引入代码到生成的识别器字节码文件,后者引入字段或方法到生成的识别器字节码文件。

可以使用parser或者lexer前缀,限制引入的目的地。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
grammar Count;

@header {
package foo;
}

@members {
int count = 0;
}

list
@after {System.out.println(count+" ints");}
: INT {count++;} (',' INT {count++;} )*
;

INT : [0-9]+ ;
WS : [ \r\t\n]+ -> skip ;

Java类文件需要在foo目录中。

grammar文件在没有指定-o选项时,为了生成代码,也需要在foo目录中。

参考资料